{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### (exceprt from Python Machine Learning Essentials, Supplementary Materials)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Sections\n",
    "\n",
    "- [Implementing a perceptron learning algorithm in Python](#Implementing-a-perceptron-learning-algorithm-in-Python)\n",
    "    - [Training a perceptron model on the Iris dataset](#Training-a-perceptron-model-on-the-Iris-dataset)\n",
    "- [Adaptive linear neurons and the convergence of learning](#Adaptive-linear-neurons-and-the-convergence-of-learning)\n",
    "    - [Implementing an adaptive linear neuron in Python](#Implementing-an-adaptive-linear-neuron-in-Python)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Display plots in notebook \n",
    "%matplotlib inline\n",
    "# Define plot's default figure size\n",
    "import matplotlib"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Implementing a perceptron learning algorithm in Python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "\n",
    "class Perceptron(object):\n",
    "    \"\"\"Perceptron classifier.\n",
    "\n",
    "    Parameters\n",
    "    ------------\n",
    "    eta : float\n",
    "        Learning rate (between 0.0 and 1.0)\n",
    "    n_iter : int\n",
    "        Passes over the training dataset.\n",
    "\n",
    "    Attributes\n",
    "    -----------\n",
    "    w_ : 1d-array\n",
    "        Weights after fitting.\n",
    "    errors_ : list\n",
    "        Number of misclassifications in every epoch.\n",
    "\n",
    "    \"\"\"\n",
    "    def __init__(self, eta=0.01, n_iter=10):\n",
    "        self.eta = eta\n",
    "        self.n_iter = n_iter\n",
    "\n",
    "    def fit(self, X, y):\n",
    "        \"\"\"Fit training data.\n",
    "\n",
    "        Parameters\n",
    "        ----------\n",
    "        X : {array-like}, shape = [n_samples, n_features]\n",
    "            Training vectors, where n_samples is the number of samples and\n",
    "            n_features is the number of features.\n",
    "        y : array-like, shape = [n_samples]\n",
    "            Target values.\n",
    "\n",
    "        Returns\n",
    "        -------\n",
    "        self : object\n",
    "\n",
    "        \"\"\"\n",
    "        self.w_ = np.zeros(1 + X.shape[1])\n",
    "        self.errors_ = []\n",
    "\n",
    "        for _ in range(self.n_iter):\n",
    "            errors = 0\n",
    "            for xi, target in zip(X, y):\n",
    "                update = self.eta * (target - self.predict(xi))\n",
    "                self.w_[1:] += update * xi\n",
    "                self.w_[0] += update\n",
    "                errors += int(update != 0.0)\n",
    "            self.errors_.append(errors)\n",
    "        return self\n",
    "\n",
    "    def net_input(self, X):\n",
    "        \"\"\"Calculate net input\"\"\"\n",
    "        return np.dot(X, self.w_[1:]) + self.w_[0]\n",
    "\n",
    "    def predict(self, X):\n",
    "        \"\"\"Return class label after unit step\"\"\"\n",
    "        return np.where(self.net_input(X) >= 0.0, 1, -1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Training a perceptron model on the Iris dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Reading-in the Iris data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <th>petal length (cm)</th>\n",
       "      <th>petal width (cm)</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.3</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>6.5</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.0</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>6.2</td>\n",
       "      <td>3.4</td>\n",
       "      <td>5.4</td>\n",
       "      <td>2.3</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>149</th>\n",
       "      <td>5.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.8</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       "145                6.7               3.0                5.2               2.3   \n",
       "146                6.3               2.5                5.0               1.9   \n",
       "147                6.5               3.0                5.2               2.0   \n",
       "148                6.2               3.4                5.4               2.3   \n",
       "149                5.9               3.0                5.1               1.8   \n",
       "\n",
       "         label  \n",
       "145  virginica  \n",
       "146  virginica  \n",
       "147  virginica  \n",
       "148  virginica  \n",
       "149  virginica  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.datasets import load_iris\n",
    "\n",
    "iris = load_iris()\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "data = np.hstack((X, y[:, np.newaxis]))\n",
    "\n",
    "labels = iris.target_names\n",
    "features = iris.feature_names\n",
    "\n",
    "df = pd.DataFrame(data, columns=iris.feature_names+['label'])\n",
    "df.label = df.label.map({k:v for k,v in enumerate(labels)})\n",
    "df.tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Plotting the Iris data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEPCAYAAABFpK+YAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcFOW1//HPGYYdCSCLbIJCEiGSnyHukDBuGLO4JBLB\nezVGfrnRYCJmMS4xTGKuRv0lGJebhBvjlivJNd4YkysuLKOCCWrUCIJoQFABEVcwwAzMnN8f1TPT\nM3RPV/dUdddMf9+vV796qrq6ntPPwOmaU089Ze6OiIiUj4pSByAiIsWlxC8iUmaU+EVEyowSv4hI\nmVHiFxEpM0r8IiJlJvbEb2YfMLO7zWy1mT1vZkfE3aaIiGRXWYQ2fgbc7+7TzKwS6FWENkVEJAuL\n8wIuM9sHeNbdx8TWiIiI5CXuUs+BwJtmdquZPW1m88ysZ8xtiohIG+JO/JXAROBmd58I7AAuiblN\nERFpQ9w1/teAV939qdTy74Hvtt7IzDRhkIhIntzdCnlfrEf87r4FeNXMPpRadRywKsu2HfIxZ86c\nkseg+Esfh+LvmI+OHH97FGNUzzeA/zKzrsA64MtFaFNERLKIPfG7+9+Bw+JuR0REwtGVu+1UVVVV\n6hDaRfGXluIvrY4ef6FiHccfOggzT0IcIiIdhZnhBZ7cLUaNv2CjR49mw4YNpQ5D0owaNYr169eX\nOgwRaYdEH/GnvtFKEJFko9+JSDK054hfNX4RkTKjxC8iUmaU+EVEyowSv4hImVHiL6INGzZQUVFB\nQ0NDqUMRkTKW6OGcBdu9G267DV55BY48Ej7zmVJHBATzEWlUjIiUWsc84n/1VbjxRrjpJnj99Zav\n1dfDscfC7Nnwox/BF78IP/hBLGFcc801jBgxgr59+zJu3DiWLFmCu/PjH/+YsWPHMmjQIKZPn867\n774LwJQpUwDo168fffv2Zfny5bg7P/rRjxg9ejT77bcf55xzDtu2bQOgtraWs846i4EDB9K/f3+O\nOOIItm7dCsBtt93G+PHj6du3L2PHjmXevHmxfEYR6YRKPcNc6ujXM8m4fvVq97593Xv0CB79+7uv\nW9f8+sMPu/fp4w7Nj65d3XfubN5m+3b3005z79XLfb/93H//+4ztt2XNmjU+cuRIf/31193dfcOG\nDb5u3TqfO3euH3XUUb5p0yavq6vz8847z2fMmOHu7uvXr/eKigpvaGho2s8tt9ziH/zgB339+vX+\nz3/+0z//+c/72Wef7e7uv/zlL/3kk0/2Xbt2eUNDgz/99NO+fft2d3e///77/eWXX3Z390cffdR7\n9erlzzzzTN6fI1/ZflciUlyp/4uF5dxC3xjlI6/E/9nPups1J/WKCvd//dfm1++5J/hiSE/83bq5\nv/VW8zannebevXvz6716uT/5ZI5ubukf//iHDxkyxBcuXOi7d+9uWj9u3DhfvHhx0/KmTZu8a9eu\nXl9f7y+//LJXVFR4fX190+vHHXec//znP29aXrNmjXfr1s3r6+v917/+tU+aNMmfe+65nPGceuqp\nfsMNN+T1GQqhxC+SDO1J/B2v1PPGG0G6btTQ0LLcc/TRLV+vrISDDoL+/ZvXPfgg1NY2L9fWwsMP\n5xXGmDFjuP7666murmbw4MGceeaZbN68mQ0bNnDaaacxYMAABgwYwPjx4+natStbtmzBbO+L7DZt\n2sSoUaOalkeNGsXu3bvZsmULZ511FieeeCLTp09nxIgRXHLJJdTX1wOwYMECjjrqKPbdd1/69+/P\nggULePPNN/P6DCJSnjpe4j/1VOjVq3m5Vy847bTm5f32g0WLgmTfty988pPw0EOQnnT79m25z27d\noF+/vEOZPn06jz32GK+88goA3/3ud9l///1ZsGABb7/9Nm+//TbvvPMO//znPxk6dGjGxD9s2LAW\n8xFt2LCBrl27MmTIECorK7niiit4/vnnefzxx/nTn/7EHXfcQV1dHaeffjoXX3wxW7du5Z133uGk\nk07SSWMRCaXjJf7vfhe+8hXo3Tt4zJ4N55/fcpvDDoPVq+G994IvgSFDWr5+443Qsyd06RI8jxgB\nZ5+dVxgvvvgiS5Ysoa6ujm7dutGzZ08qKys577zzuOyyy5q+DLZu3cp9990HwKBBg6ioqGDt2rVN\n+5kxYwZz585l/fr1vP/++1x++eVMnz6diooKampqWLlyJQ0NDfTp04euXbtSWVlJXV0ddXV1DBw4\nkIqKChYsWMBDDz2Uf1+KSFnqeMM5Kyrg+uuDR6FOPx1GjYKFC4Mj/bPPDr5E8lBbW8sll1zCCy+8\nQNeuXTn66KOZN28eQ4YMwd2ZOnUqmzdvZvDgwZxxxhmcfPLJ9OzZk8svv5xJkyaxZ88eHnjgAc49\n91w2b97MJz/5SWpra/nUpz7FDTfcAMDrr7/Oeeedx8aNG+nTpw/Tp0/nX/7lX6ioqOCGG25g2rRp\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fcf72e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# select setosa and versicolor\n",
    "y = df.iloc[0:100, 4].values\n",
    "y = np.where(y == 'setosa', -1, 1)\n",
    "\n",
    "# extract sepal length and petal length\n",
    "X = df.iloc[0:100, [0, 2]].values\n",
    "\n",
    "# plot data\n",
    "plt.scatter(X[:50, 0], X[:50, 1],\n",
    "            color='red', marker='o', label='setosa')\n",
    "plt.scatter(X[50:100, 0], X[50:100, 1],\n",
    "            color='blue', marker='x', label='versicolor')\n",
    "\n",
    "plt.xlabel('petal length [cm]')\n",
    "plt.ylabel('sepal length [cm]')\n",
    "plt.legend(loc='upper left')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Training the perceptron model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n4toAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10c5f6d68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ppn = Perceptron(eta=0.1, n_iter=10)\n",
    "\n",
    "ppn.fit(X, y)\n",
    "\n",
    "plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Number of misclassifications')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### A function for plotting decision regions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from matplotlib.colors import ListedColormap\n",
    "\n",
    "\n",
    "def plot_decision_regions(X, y, classifier, resolution=0.02):\n",
    "\n",
    "    # setup marker generator and color map\n",
    "    markers = ('s', 'x', 'o', '^', 'v')\n",
    "    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n",
    "    cmap = ListedColormap(colors[:len(np.unique(y))])\n",
    "\n",
    "    # plot the decision surface\n",
    "    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
    "    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
    "    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),\n",
    "                         np.arange(x2_min, x2_max, resolution))\n",
    "    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)\n",
    "    Z = Z.reshape(xx1.shape)\n",
    "    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)\n",
    "    plt.xlim(xx1.min(), xx1.max())\n",
    "    plt.ylim(xx2.min(), xx2.max())\n",
    "\n",
    "    # plot class samples\n",
    "    for idx, cl in enumerate(np.unique(y)):\n",
    "        plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],\n",
    "                    alpha=0.8, c=cmap(idx),\n",
    "                    marker=markers[idx], label=cl)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAakAAAEbCAYAAABgLnslAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XuUHWWZ7/HvkwuGSCKiaRGIHcJKhwEvQAi3kJAIo1Hk\nMmEYFNfiqDmHsDyOOlFmDBzmhIs0iDAqBwYcWo4MiooikIwCHiDTELkmIBiwwyJJy2WguSgJQho6\n/Zw/qrp7793du2r3rtq7du3fZ61eu6t21a63Kp1+uup53+c1d0dERCSLxtW7ASIiIqNRkBIRkcxS\nkBIRkcxSkBIRkcxSkBIRkcxSkBIRkcxKPUiZ2bvM7EYze9LMNpjZoWkfU0RE8mFCDY7xXeBX7n6y\nmU0AJtfgmCIikgOW5mBeM5sCPOru+0RspxHFIiJNzt2tdF3ad1IzgZfN7FrgI8DDwFfc/c3SDa++\nOt9xatWqlRx33Mp6NyMXdC2ToeuYHF3L6i1bNiw+AennpCYABwFXuPtBwBvAN1I+poiI5ETad1LP\nAs+4+8Ph8s+Bfxppw1WrVg5+39a2kNmzF6bcNBERqZeurjVs3LgmcrtUg5S7v2hmz5hZm7tvBI4G\nnhhp27zfKre1Lax3E3JD1zIZuo7J0bWs3OzZxTcjq1efO+J2qXacADCzjwDXABOBTcDn3f21km08\n7zkpEREZ3bJlVpeOE7j774C5Y9n3nHNm0NPTnXCLsqGlpZXzz99S72aIiGRaLcZJjVlPTzd5ne/K\nbOSeLCIiMkRlkUREJLMUpEREJLMUpEREJLMUpEREJLMUpBKyYcMGFi9ezLRp0xg/fny9myMikgsK\nUgmZOHEip5xyCj/4wQ/q3RQRkdzIdBf0sfro3Lls7ekpWje1pYW7HnootWO2tbXR1tbG008/ndox\nRESaTUMGqdIgVBqAtvb08PC0aUX7HFwStEREJPsaMkiVBqGxBKCoQCciIvXXtDmpgUA38FX6eDDK\nj3/8Y6ZMmcLUqVM59thjU2qliEhza8g7qSw49dRTOfXUU+vdDBGRXMtlkJra0jLsEeDUlpbUj9vb\n20tvby/uTm9vL2bGTjvtlPpxRUTyqiGDVGkQKg1AcXJLUZ9Rqe7ubvbee2/MDDNj5513ZsaMGWza\ntKmqzxURaWYNGaSS6OCQdCeJ1tZW+vv7E/1MEZFm17QdJ0REJPsUpEREJLMUpEREJLMUpEREJLMU\npEREJLMUpEREJLMUpEREJLMUpEREJLMUpEREJLMUpMboiiuuYO7cuUyaNIkvfOEL9W6OiEguNWRZ\npCjuYDb6chL23HNPzjnnHG6//XbefPPNZD9cRESAHN5JvfEGLF0Kzz4bLN9zD5x9dvLHOfHEEzn+\n+OPZbbfdkv9wEREBGjBI3XUXXHppcHfU3w8XXgj33Tf0/uTJ8KlPwbJlcMMNcN558NnPFn/GH/8I\n27YNLT/xRPBZIiKSLQ0XpObOhcceg0sugQsugC1b4CMfKd5myRJoawuC2Zlnwv77F7//q1/Bl74U\nBKq77oKvfhVeeKFmpyBSV6V/kOkPNMmyhstJTZkCl18OH/1osNzZGdw9FbrnHvj97+GEE+C734X9\n9oO99hp6f9myIEAtWgQ77QTXXgt77FG7cxCpl/5+uO664Ge/tRW6u+Huu+G002Bcw/3JKs0g9R9L\nM9tiZr8zs0fM7MFqP6+/H77zneBOaeZMuOKK4NHfgDfegMsuC7Y555wgP3XJJaVtgjlzhj5PAUqa\nxbhxQYC66abgD7ybbgqWFaAkq2rxo9kPLHT3A939kGo/7Lbbgk4R11wDHR3BHdOaNUPvT54MP/vZ\n0CO+JUvg298u/oy77oKLLoLrr4eTThp69FeJHTt2sH37dnbs2EFfXx+9vb3s2LGjqnMTqYXW1uCP\ntHvuCV5bW+vdIpHR1SJIWZLHWbwYvve9IBhNmQJXXQULFxZvM3Fi+eW+vuCR4b77wte/DsccU/lz\n+QsuuIDJkydz8cUX86Mf/YjJkyfzzW9+s+LzEam17m5Ytw7mzw9eu7vr3aJ0KPeWD+aFz8rSOIDZ\nJuBVwIHvu/u/jbCNX3318HYsW2ak3b56MTNGOmeRNDVLTqpZzjNPwt/3w0a01qLjxBHu/oKZTQN+\nY2ZPuvu9NTiuiJQYN674F3Vraz5/cRfm3ubMCe4YlyzJ33k2g9SDlLu/EL6+ZGa/BA4BhgWpVatW\nDn7f1raQ2bMXpt00kaZU+os6r7+4C3Nv8+cr95Y1XV1r2LhxTeR2qQYpM5sMjHP3183sncDHgHNH\n2va441am2RQRqaH+/uLgV7pcC6W5t9bWygJVFs4hz2bPLr4ZWb16xNCQeseJ9wH3mtkjwP3AKne/\nI+VjikgdDeSDBjpkdHcHy7XsuNDfH+SgliyBBQuC17vvjt+GLJyDBFK9k3L3zcABaR5DRLIlC/mg\nanNvWTgHCeiSi0jisjAWq9rcWxbOQRSkRHInC+ODGmEsVtR1aoRzaAaZDlItLa2YWS6/Wlr0Z5kk\nLwu5lGrzQbUQdZ0a4RyaReqDeWM1YpTBvCJSue7u4bmUWj+qaoSecVHXqRHOIU9GG8yrSy6SM1nI\npTTCWKyo69QI59AMdNlFciaJXEpfX/nlKFnIi9Ui55SF88w7BSmRHEkil9LXBytXwv33B8v33x8s\nxw1UWcmLpZ1zysJ5NgPlpERyJolcyv33w09/Ch/8YDAdzimnwGGHxd8/C3mxWuScsnCeeaGclEiT\nSCKXcthhQYB69NHgtZIABdnIi9Ui55SF88w7BSkRGea++4I7qAMOCF7vu6+y/avN98TJ9WRhnJPG\nUqVPQUpEirz1FtxwAxx9NCxdGrzecEOwPo5a1M3LwjgnjaWqDeWkRGSYTZvglluGci0nnAAzZ8bf\nv9p8T5xcTxbGOWksVXKUkxKR2GbOLM61VBKgoDZ187IwzkljqdKnSypSgWrHxSSRa6lWnDFQUbmW\ntK9DnFyP8kHNQUFKJKZqx8UkkWupVpwxUFG5lrSvQ5xcj/JBzUM5KZEKVDsuJolcS7XijIGKyrWk\nfR3i5HqUD8oX5aREElDtuJgkci3VijMGKirXkvZ1iJPrUT6oOeifVaQC1eZqspBruf/+4jFQA4/+\nKlGL6xAl6hiqq5cPClIiMVWbq8lCrqWvD1avDh7xLV0avK5eXVkB2VpchzhtiDqG6urlg3JSIhWo\nNleThVxLXx9MmDD6chy1uA5Roo6hunqNRTkpkQRUm6vJQq6lNCBVGqCgNtchStQxVFcvHxSkRBLU\nLGN3qs05JZEvijpGs/xb5J2ClEhCmmXsTrU5pyTyRXGO0Qz/Fs1AOSmRBDXL2J1qc05J5IuijtEs\n/xZ5oZyUSA00y9idanNOSeSLoo7RLP8Wead/NpEaipOLiVNbr9pjVKvafI/yRRKXgpRIjcTJxcSp\nrVftMaqVxHxRyhdJXMpJidRQnFxMnNp61R6jWtXme5QvklLKSYlkwPTpxbmY6dOHb3PIIcW19Q45\npPj9qMd5tRgfVG2+R/kiiUs/GiI10t8PV14Ja9cGuZi1a4Pl0rJIl14Kjz0W1NZ77LFguZLu28r3\nSJ7UJEiZ2TgzW29mt9bieCJZZVZ+ub8fXn4Z3v1umDUreH355aEgNG4cLFoUPM7r7AxeFy0auhNR\nvkfyZtScVMyA8qq7fy7yIGb/AMwBprr78SO8r5yUNIX+frj33uBR3Pz5cOSRwx919fXBb387tM0R\nRwwvXdTZOfT+ggXDj6F8jzSa0XJS5ap2/RXw38u8b8AVUQc2s72ATwLfBJZHbS/SyKKKtz7zTPGj\nuNbW4Tmj554rv82WLcXvf+ADMGPG0PtR+Z4sFLkViavcj93Z7v6fZb7WAOfGOMa/AGcCulWSXIvq\nPp7EVB19fXDNNXD44cH7hx8eLCfZRV3TXEiWpNoF3cyOBT7h7l8ys4XA19z9uBG20+M+yYWo7uNJ\n3MVs3gw33zzUxfzEE2HvveO3MQtT2IuUGsvjPgDM7GDgbKA13N4Ad/cPxzjuPOB4M/sksDMwxcyu\nc/fTSjdctWrl4PdtbQuZPXthjI8XyZbDDoMNG4Lu4wccMHx8UxJTdey991AX8/nzKwtQUNxFff78\n6CnsR9tGpBpdXWvYuHFN5HaRd1Jm1kXwuO5xYPCG390r6thqZkcR3Emp44TURS3yLEncSUXRnZTk\nUTWDeV9y91vdfbO7dw98pdBGkdTUIs8SNTV7Em3o64OOjuKcVEdHZTmpek9hL1KJOHdSRwOfAe4E\negfWu/tNiTVCd1JSA7W4O4jq3ZdEG7ZsgV/+cugz/uZvinv3RVHvPsmiMeekgM8D+wITGXrc50Bi\nQUqkFmqRZ4mamj2JNsyYUfwZlQQoyMYU9iJxxQlSc919duotEUlZabmgkcYoVSvOZH/VtqEW5yGS\nFXH+Pvqtme2XektEUlSLPEu106pn5TxEsiROTupJYB9gM0FOqpIu6PEaoZyU1EAt8izVTqseh/JF\nkkfV5KQWp9AekZqrRZ4lKueURBuUL5JmEufH+/0EhWQHup6/CuyebrNEGlNpXb0tW+rdIpHGFidI\n/SvwesHyX8J1IlKg2rp6IjJcnMd95gWJK3fvN7M4+4k0lQkTgkG8N98Mb70V3EktXTq8G7qIxBfn\nTmqTmX3ZzCaGX18BNqXdMJFGVFhXb86cyuvqiUixOEHqDOAI4DngWeBQ4PQ0GyXSqKKmbi/tKq6u\n4yLlRQYpd+9x90+7e4u7v8/dT3X3nlo0TqSRRI1h0jxNIpUbNUiZWeTdUpxtRJrFuHFw2mlD3c5b\nW4PlgS7i48bBokXBOKrOzuB10SJ1IRcpp1xK9xtm9nKZ9w34CvD9ZJsk0riixjBpniaRypQLUv8J\nDJtFt8RvEmyLSFl5qLQQp+5eHs5TJCmjBil3/3wtGyJSzkA+Z9Gi4Jd6d3eQ7yl8nJZ1hTmrgeBU\neg55OE+RJEXW7qtJI1S7T2LIw2yxce6S8nCeIpWqZmZekUwozOfMmdOYv7jj1N3Lw3mKJEVBShpG\n1BikvGiW8xSJI7Jgi5m9AzgJmFG4vbufl16zRIrFyefkQbOcp0hcceaTug14DVgH7BhY7+6XJtYI\n5aQkhmbp9dYs5ylSqJr5pPZyd80pJXXXLPMoNct5isQRd/r4D6XeEml6UXXtVPdOpPmUK4v0uJk9\nBhwJrDezLjN7rGC9SGKi6tqp7p1Icyr3uO9TNWuFNL3CunaF44NGqns30vsikk+j/hcvmC7+goHv\nC9fVronSLKLGB2n8kEjzifN36P6FC2Y2HpiTTnOkmUWND9L4IZHmUy4ntcLMtgEfNrOt4dc2oAe4\npWYtlKYQZy6mcu+LSOPq7Bz9vTjjpNrdfUXCbSo9hsZJSeT4II0fEsmHjg7oGZg695k/ArBlR+uY\nx0ndaGYHlax7Deh2976qWipSIGp8kMYPiTSe9nbg+eeGVuwIakKs2PUqAE6ffgOsWIEtG3n/OEHq\nSuAg4DGCiQ4/BPwe2NXMznD3O8baeBERyYfOTlh784uwvXfYe5vnnAyzZg2tWLCAoNIeQPkHdXGC\n1PPAUnffAGBm+wHnAf8I3AQoSImINIHOTnjqqaHlnqe3wp//PLg8b9I6rr/ypRH2XDrmY8YJUm0D\nAQrA3Z8ws33dfZPZsMeHRcLitJ3ATuGxfu7u5465tSIiUhPt7cC2rUMrtm2DHTuYN2nd4KpZwPVz\nLoKlYw9CUeIEqQ1m9q/AT8LlU4AnwgD0drkd3b3XzBa5+xth1/W1ZvZrd3+wumaLDKeOFSJj19EB\nPY+GuaMwb7R5+lFDG0wBVoz0aC69AAXxgtTngC8CXyXISd0LfJ0gQC2K2tnd3wi/fUd4PHXjk8Rp\n2nWR8gq7ea+9rfgx3YAVu17F6RfOKFyTeruiRAYpd38TuDT8KvV61P5mNo5gmo99gCvc/aFKGykS\nRWWTRIq1t4ffPP8c7NhBy/hXBt9rAR6Yc8YIj+lm1Kh18cWZ9HAesBJopXjSw5lxDuDu/cCBZjYV\nuNnM9nP3J0q3W7Vq5eD3bW0LmT17YZyPFxlUWDZp/nyVTZLmMNirrlDYw27FrlfBFErujgak+5gu\nypquLtZs3Bi5XZzBvH8A/oHhkx6+MupOo3/WPwOvu/tlJes1mFeq1t09/E5KgUrypL2dwcGvheZN\nWsf1+180tGLWrLCbd+OwZcvGPJj3NXf/9ZgOavZe4G13f83MdgaOAS6K2E2kYpp2XfKio6N4uWdd\ncVDaPP2ounRgqJc4d1IXAeMJxkQNjtJy9/WRHx5MlvhDghqB44Cfuvs3R9hOd1JSNfXuk0bTftbW\n4hVhZ4bCbt4LJj00yuO6fKnmTurQ8PXggnUOfDRqR3d/nKBahUjqVDZJsq79rK3BeCMYHHN0/bTl\nQxvs09IQnRlqKU7vvshu5iIiMqSzE9be+NzgeKNCgyWCBnNG9e/mnWVxeve9D7gQ2MPdPxGWRTrc\n3TsidhURyaXCvFFPD6N3Zrg82RJBzSjO477/C1wLnB0ubwR+CihIiUhTaG8HXgq7eW/vpWX8Kyyd\ncuPg+wOVvCV5cYLUe939Z2a2AsDd+8xs+D2siEiDi6zkDQWP6mYUvKsAlZY4QeovZvYewnJGZnYY\nwXxSIiINZ6A80Nq1jP6YLuFK3jJ2cYLUcuBWYB8zWwtMA/421VaJiCRgsDTQgIISQS3AA9OX6DFd\nxsXp3bfezI4CZhMUmO1y97LVz0VEaq19+YvwdsFk4SUzwAKcvkdp7kgBKutGDVJmtmSUt9rMDHe/\nKaU2iYhEaj+ruJJ3y/hXeODkkjrYyh01vHJ3UseVec8JKlCIiCRuWGmgR8uMOSoa/NpY9eok2qhB\nyt0/X8uGiEjz6uwM5ziCEUsDzZqIxhw1qTgdJ0REEtPezmAHhkKDJYJGnQFWmpGClIgkbrCb92hj\njkat5K3gJMUUpESkKkXdvLcNdWYY7Ob96UtHmNtIwUjiGUvvPgD17hNpMh0d0LOhYAbYt/sGK3kv\nmPTQ4OrT59ypzgySGPXuE5ERjVTJe/P0o6ClZWijwWA0o2BPdWaQ5Kh3n0iTGlslbz2mk9qKlZMy\ns2OB/YFJA+vc/by0GiUiyWtvJ8gZbX9zsJL3rIlbAJgFXD99uXrVSebEmU/qKmAysAi4hqBu34Mp\nt0tExmiwkvcIJYI2Tz8q6OI9b546M0hDiHMndYS7f9jMHnP3c83sUuDXaTdMRKK1tzP6Y7qTf1G8\ncsECFIik0cQJUm+Gr2+Y2R7AK8D702uSiBTq6AhzRgOeH6Ezw4iP6dSrThpfnCC12sx2BS4B1hP0\n7Lsm1VaJNKn25S8WrwgHwhZW8mYKnH7hjIKNdHck+RUnSH3L3XuBX5jZaoLOE9vTbZZIcxixkvcB\nZxRvtHQpxV28RZpHnCB1H3AQQBises1s/cA6ERnZQGmgAaVjjgYMr+StcUYiA8pVnNgd2BPY2cwO\nJJjwEGAqQW8/ESnQ2RlOSQ6DnRlaxr8y+P68iVtUyVukQuXupD4OfA7YC7isYP1W4KwU2ySSeYOV\nvAsVlAg6fXrpDLAiMhblKk78EPihmZ3k7r8YbTuRvGtfXqaS97x5QysGxx3NQJ0ZRJIRJye11sw6\ngD3c/RNmth9wuLt3RO0o0iiKSgQ9PUJnBlXyFqmLOEHq2vDr7HB5I/BTQEFKGk5HRxiEBmzbNviY\nbsAs4Po5F6mSt0gGxAlS73X3n5nZCgB37zOz4V2URDKmtHv3gM3TjxpaGHUWWHVmEMmCOEHqL2b2\nHoJBvJjZYcBrqbZKJKbCbt5r11JUIkiP6UQaX5wgtRy4FdjHzNYC0wiKzEYys72A64DdgR3Av7n7\n98bYVmliw0oDvfTiYCXvAS3AA9OXlNwZ6TGdSCOLDFLuvt7MjgJmE4yV6nL3t2N+fh+w3N0fNbNd\ngHVmdoe7/2HsTZZmMFjJG0YuDTQJTj/xj7pLEsm5OFN1TAK+CBxJ8MjvHjO7yt0jSyO5+wvAC+H3\nr5vZkwQDhBWkZFDZSt77XxQsjFgaqHRZRPImzuO+64BtwOXh8meAfwdOruRAZjYDOAB4oJL9JB8G\nunj3bCgz5kgdGESkRJwg9UF3369g+W4ze6KSg4SP+n4OfMXdX69kX2k87WdtLV4R9rCbN2ld0L37\n07/QYzoRiSVOkFpvZoe5+/0AZnYo8HDcA5jZBIIA9e/ufsto261atXLw+7a2hcyevTDuIaROOjqg\n59HhpYFaxr/CA3ssGVq3T4vGHIlIkTVdXazZuDFyO3P38hsEeaTZwEDS4ANAF0GnCHf3D0fsfx3w\nsrsvL7ONX311+XZI/XV2Dq/kvWLXqzh9cUE+adgdUuCjF17I1m3bBpenTpnCXWclWwKyFscQkXTY\nsmW4u5Wuj3MntXjMBzWbB3wWeNzMHiHoeHGWu9821s+U9LS3l6wYrTNDUSXvGcTpwLB12zYe3mWX\nweWDC4JJUmpxDBGprThd0LvH+uHuvhYYP9b9JV3t7QTjjWBwzNHSKTcOvq9K3iJSb3HupCQHylby\nbmmBWbPCR3UzCt5VgBKR+lKQypHOTnjqKehZN/wxXb1LBE2dMqXo8dvUKVMa8hgiUluRHSdq0gh1\nnKjIYImgbWFX77CS90CJoKVTbuT0C2fUrX0iIpWqpuOE1FH7WVuDIDQg7Fm3efpRQQVvGKGS94wa\ntU5EJF0KUhlTWiKoZfwrPHDypcUbLViA8kUi0gwUpGqoo2SayPglgjT4NY5ajJPa8+//Hvr6hlZM\nmMBzl18++g5joPFeIkMUpFLU2QlrbwvzRgWlgQaoRFCyajJOqq+P5yYM/bfZszBgJUTjvUSGKEgl\npGwl72nLRygNNEB3SSIio1GQqsDALLBrb660krfujERExkJBahSjlQhqGf9KMAOspiUvEpVHSSKX\n854zzmBiwZCJt8145aqhiRD/6/XX2TN8rDpwjMRNmFD8iC+FY2i8l8iQpg9SHR1hB4ZCI5UImnOn\nKnmXEZlHSSCXM9GdF2xoGMXuJWP83r/LLsVteD35WWGS7iQxEnWSEBnSdEFq1Ere+9w5tNFgMJpR\nsKcm3xMRqbXcBanCbt49PVRQyVtBSEQkaxo+SLW3E5QH2v7m4GO6WRO3AGEX7+nLVck7AVE5p8g8\nSoxcTlTOqZfiR3ylXVeefvVVdn/11VHfj5MXq0VuLYrGSYkMaagg1b78RXi74BdEaYmgefPUmSEl\nUTmnqF+icX6RR+Wc9tltt7I5p3dA2f3j5MVqkVuLonFSIkMyGaQ6OspU8laJIBGRppGZINX+xeJ6\ndSt2Ha2St3rViYg0i8wEqc1Xls4oP6MezcilJHIcm//0p6J8z9s2rKJ+WXFyOVE5p6g2RO2/3Z3d\n33pr1P2h+txaEtda46REhmQmSEl6kshxTDLjuYkTB5crzsXEyOVE5Zyi2jB53Liyx9j73e+OHEdV\nbW4tiWutThIiQ8bVuwEiIiKjUZASEZHM0uO+JhAnnxSZS6k2FxNjnFRULiYypxRxjCRyPVHnWZP6\ngSJNRP+DmkCcfFJULqXaXEyccVJRuZionFLUMZLI9USdZy3qB4o0Ez3uExGRzFKQEhGRzNLjvmaQ\nQD4oSi3G9mQh3xN1nrW4DqrtJ81EQaoJJJEPSnv/OLKQ74k6z1pcB9X2k2aix30iIpJZClIiIpJZ\netyXA82So1BNu4CugzSTVIOUmXUAnwJedPcPp3msZtYsOYo8Bt6x0HWQZpL2475rgY+nfAwREcmp\nVIOUu98L/CnNY4iISH4pJ5UDGpsjInmlIJUDGpsjInmVmSC1ctWqwe8XtrWxcPbsOrZGRETStKar\nizUbN0ZuV4sgZeFXWSuPO64GTRERkSxYOHt20c3IuatXj7hd2l3QfwwsBN5jZn8E/re7X5vmMSUd\nGpsjIvWQapBy91PT/HypHXWSEJF6UFkkERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJ\nLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUp\nERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJ\nLAUpERHJLAUpERHJLAUpERHJLAUpERHJLAUpERHJrNSDlJktNrM/mNlGM/untI8nIiL5kWqQMrNx\nwP8BPg7sD3zGzPZN85hZtaarq95NyA1dy2ToOiZH1zI9ad9JHQI85e7d7v428BPghJSPmUlrNm6s\ndxNyQ9cyGbqOydG1TE/aQWpP4JmC5WfDdSIiIpHSDlI2wjpP+ZgiIpIT5p5ezDCzw4CV7r44XP4G\n4O5+ccl2ClwiIk3O3Yfd2KQdpMYDXcDRwH8BDwKfcfcnUzuoiIjkxoQ0P9zdd5jZl4A7CB4tdihA\niYhIXKneSYmIiFRDFSdqxMzGmdl6M7u13m1pVGa2xcx+Z2aPmNmD9W5PIzOzd5nZjWb2pJltMLND\n692mRmNmbeHP4vrw9TUz+3K925U3qT7ukyJfAZ4Apta7IQ2sH1jo7n+qd0Ny4LvAr9z9ZDObAEyu\nd4MajbtvBA6EwcIFzwK/rGujckh3UjVgZnsBnwSuqXdbGpyhn9mqmdkUYL67Xwvg7n3uvrXOzWp0\nxwBPu/szkVtKRfQfvjb+BTgTjRGrlgO3m9lDZvY/6t2YBjYTeNnMrg0fVX3fzHaud6Ma3CnADfVu\nRB4pSKXMzI4FXnT3RwnuBEYa4CzxHOHuBxPclf5PMzuy3g1qUBOAg4Ar3P0g4A3gG/VtUuMys4nA\n8cCN9W5LHilIpW8ecLyZbSL4S2uRmV1X5zY1JHd/IXx9ieDZ/yH1bVHDehZ4xt0fDpd/ThC0ZGw+\nAawLfy4lYQpSKXP3s9z9A+4+E/g0cJe7n1bvdjUaM5tsZruE378T+Bjw+/q2qjG5+4vAM2bWFq46\nmqBTj4zNZ9CjvtSod580ivcBvwxLaE0AfuTud9S5TY3sy8CPwkdVm4DP17k9DSnM5R0DnF7vtuSV\nBvOKiEhy6R0kAAADv0lEQVRm6XGfiIhkloKUiIhkloKUiIhkloKUiIhkloKUiIhkloKUiIhkloKU\nyBiY2VFmtiru+gSOd4KZ7VuwfLeZla0SEbblz2a2OoHjTwqno9huZrtV+3kicSlIiYzdaIMM0xh8\neCKw/xj263T3T1V7cHff7u4HAs9X+1kilVCQklwKyyitDv/6f8zMTg7XH2Rma8JK6r82s/eF6+82\ns+8UbH9wuH6uma01s3Vmdq+ZzaqwDR1m9kC4/3Hh+v9mZr8Ij99lZhcX7LM0XHd/WJ38cjM7nKCA\n6bfCquUzw83/LvzsP5jZvJht+sfw/B4xswsLzv2y8JpsMLODw/Z1mdn5pR8R9/xFkqCySJJXi4Hn\nBu4izGxKOLnf5cDx7v6Kmf0dcCGwNNxnZ3c/0MzmA9cCHwKeJJh7qd/Mjgbagb+N2YazgTvdfamZ\nvQt40Mz+X/jeR4ADgLeBLjP7HsGkjv8rXP86cDfwqLvfF87ovMrdbwrPB2C8ux9qZp8AVgJ/Xa4x\nZraYINjNdfdeM9u14O1ed58bzix7C8Fkfn8GnjazyzTRpNSLgpTk1ePAJWbWDvyHu99rZvsDHwR+\nY8Fv+XEUP766AcDd7wmD2lSCmZSvC++gBuoGxvUx4DgzOzNc3gn4QPj9ne7+OoCZbQBagWnAGnd/\nLVx/I1Duzu2m8HVduH+UY4Br3b0XwN3/XPDereHr48Dv3b0nbMPTwHRAQUrqQkFKcsndnzKzOQRz\nT51vZncCNxP8Ah7t0VhpLsmB8wkq1y8xs1aCu5u4DDjJ3Z8qWml2GNBbsKqf4P9ipfONDXzGDuL9\nXzZGz5cNfFZ/SdsqDcwiiVJOSnLJzN4PvOnuPwa+TTBfUhcwLQwSmNkEM9uvYLdTwvVHAq+5+zbg\nXcBz4fuVVgq/naDa+ECbDojY/kFggZm9K3w0eVLBe9sI7upGEye43QF8YWAWXjN7d4x9ROpKQUry\n6kMEOaBHgH8GLnD3twnySReb2aPAI8DhBftsN7P1wJXAF8J13wIuMrN1VP7/5XxgYthR4XHgvFG2\ncwB3f54gR/YgcA+wGXgt3OYnwJlhB4yZjHzXV5a7307wWO/h8Dy/FmNfTZMgdaWpOkQIergBX3P3\n9XVuxzvd/S9mNp5g9uEOd79ljJ91FPB1dz8uwfZtBua4+6tJfaZIObqTEglk5a+1leHd3+PAprEG\nqNBbwP5JDuYFxhPkrURqQndSIiKSWbqTEhGRzFKQEhGRzFKQEhGRzFKQEhGRzFKQEhGRzFKQEhGR\nzPr/iF/1CqfAEx4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x111fc1be0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_regions(X, y, classifier=ppn)\n",
    "plt.xlabel('sepal length [cm]')\n",
    "plt.ylabel('petal length [cm]')\n",
    "plt.legend(loc='upper left')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Adaptive linear neurons and the convergence of learning"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Implementing an adaptive linear neuron in Python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class AdalineGD(object):\n",
    "    \"\"\"ADAptive LInear NEuron classifier.\n",
    "\n",
    "    Parameters\n",
    "    ------------\n",
    "    eta : float\n",
    "        Learning rate (between 0.0 and 1.0)\n",
    "    n_iter : int\n",
    "        Passes over the training dataset.\n",
    "\n",
    "    Attributes\n",
    "    -----------\n",
    "    w_ : 1d-array\n",
    "        Weights after fitting.\n",
    "    errors_ : list\n",
    "        Number of misclassifications in every epoch.\n",
    "\n",
    "    \"\"\"\n",
    "    def __init__(self, eta=0.01, n_iter=50):\n",
    "        self.eta = eta\n",
    "        self.n_iter = n_iter\n",
    "\n",
    "    def fit(self, X, y):\n",
    "        \"\"\" Fit training data.\n",
    "\n",
    "        Parameters\n",
    "        ----------\n",
    "        X : {array-like}, shape = [n_samples, n_features]\n",
    "            Training vectors, where n_samples is the number of samples and\n",
    "            n_features is the number of features.\n",
    "        y : array-like, shape = [n_samples]\n",
    "            Target values.\n",
    "\n",
    "        Returns\n",
    "        -------\n",
    "        self : object\n",
    "\n",
    "        \"\"\"\n",
    "        self.w_ = np.zeros(1 + X.shape[1])\n",
    "        self.cost_ = []\n",
    "\n",
    "        for i in range(self.n_iter):\n",
    "            output = self.net_input(X)\n",
    "            errors = (y - output)\n",
    "            self.w_[1:] += self.eta * X.T.dot(errors)\n",
    "            self.w_[0] += self.eta * errors.sum()\n",
    "            cost = (errors**2).sum() / 2.0\n",
    "            self.cost_.append(cost)\n",
    "        return self\n",
    "\n",
    "    def net_input(self, X):\n",
    "        \"\"\"Calculate net input\"\"\"\n",
    "        return np.dot(X, self.w_[1:]) + self.w_[0]\n",
    "\n",
    "    def activation(self, X):\n",
    "        \"\"\"Compute linear activation\"\"\"\n",
    "        return self.net_input(X)\n",
    "\n",
    "    def predict(self, X):\n",
    "        \"\"\"Return class label after unit step\"\"\"\n",
    "        return np.where(self.activation(X) >= 0.0, 1, -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10e3ed128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))\n",
    "\n",
    "ada1 = AdalineGD(n_iter=10, eta=0.01).fit(X, y)\n",
    "ax[0].plot(range(1, len(ada1.cost_) + 1), np.log10(ada1.cost_), marker='o')\n",
    "ax[0].set_xlabel('Epochs')\n",
    "ax[0].set_ylabel('log(Sum-squared-error)')\n",
    "ax[0].set_title('Adaline - Learning rate 0.01')\n",
    "\n",
    "ada2 = AdalineGD(n_iter=10, eta=0.0001).fit(X, y)\n",
    "ax[1].plot(range(1, len(ada2.cost_) + 1), ada2.cost_, marker='o')\n",
    "ax[1].set_xlabel('Epochs')\n",
    "ax[1].set_ylabel('Sum-squared-error')\n",
    "ax[1].set_title('Adaline - Learning rate 0.0001')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Standardizing features and re-training adaline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# standardize features\n",
    "X_std = np.copy(X)\n",
    "X_std[:,0] = (X[:,0] - X[:,0].mean()) / X[:,0].std()\n",
    "X_std[:,1] = (X[:,1] - X[:,1].mean()) / X[:,1].std()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAakAAAEbCAYAAABgLnslAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmYHGW59/HvLyQQlAQIEkCWBJREwIVdEAwEz1FEQEQR\nBQWB8xr1uIGKL/BqAniM6MEFlEUJKCDiipAc2Q4mLNEghC1sCUIIYTMqkASBkGTu9496JtMzmZmu\nmanurun+fa6rr6mqrq66qybpe567nnpKEYGZmVkZDWl0AGZmZj1xkjIzs9JykjIzs9JykjIzs9Jy\nkjIzs9JykjIzs9JykrKGk3SspFtzrjtZ0mVpemtJyySpthE2jqRLJJ2RpveV9FCjYzKrJycpqxlJ\nsyQ9J2lYjtX7csNeAETE4ogYGQ262U/S7pKmp2N8TtL9ks6UtGEt9hcRt0XEDkVsS9JCSQf08v5+\nklanPwKWSXpC0i8l7V7E/mtB0kxJxzc6DiuWk5TVhKQxwL5AG3Bog8MpnKR3ADOBW4HxETEKOBBY\nBbyth8+sU78IC/FU+iNgJLAX8DBwq6SJDY7LWoiTlNXKMcCfgZ8Cn6h8Q9IoSddIWippDvCGLu9/\nP/3lvlTSHZL27W4HksZIapM0JM3PlHSGpNvSX//XSRpVsf5ekmZLel7S3ZL2G8DxnQVMi4hvR8Tf\nASLiyYg4PSJuSfs7NsXyXUn/BCZL2k7STZL+IWmJpMsljayIcRdJc9OxXwkMr3hvP0mLK+a3kPSb\ntJ1HJX2u4r3JqeXzs3Qu5knaNb13KbANMD299+VqBxsRT0fEZOCidOzt+3mTpBsk/VPSQ5KOqHjv\nIEkPpH0slnRSxXvvT7+DpZIekfTutHykpIskPZ0+c2Z7Obe9LCzpO6nl+qik96T3vgG8E/hh2t85\nuX6LVn4R4Zdfhb+AR4BJwK7Aq8CmFe9dmV7DgZ2AJ4FbKt4/CtiI7I+oE4FngHXTe5OBS9P0GGA1\nMCTNz0z7fQOwXpr/ZnpvS+AfwHvS/LvS/Cb9OLbXkLWYJlRZ71hgJfCZdCzrpdjeBQwFNgFmAd9N\n6w8DHgc+D6wDfDCduzPS+/sBT6RpAXcCp6V1xwJ/Bf694jy9BLwnrftN4M8VsS0EJvYS+5p9dVk+\nMR37+uk8PEH2B4mAnYG/AzukdZ8G3pGmNwR2TtN7Ai8AB6T5LYBxafr3wHnp38brgDnA/6k4nyuA\n49P+PkXW2muPbSZwfKP/7ftV7MstKStcavlsA/wqIu4i+/I8Kr03BDgc+FpEvBIRDwA/q/x8RFwR\nES9ERFtEfI/sy318zt1fEhGPRsQK4FdkX5wARwP/ExHXp33cRPYlf1A/DnFjsqTzbMUxn5VaaC9K\nOrVi3aci4rx0LCtSbDdFxKqI+CfwPbKEALA3MDQizomI1RHxW+COHmLYE3hdRPxXWvdxslbORyrW\nuS0iro+IAC4D3tplG/3pcPJ0+txGwMHAwoi4NDL3AL8FPpTWfRXYSdKIiFia3ocsyUyLiD8CRMQz\nEbFA0miykumJ6d/GP4DvAx+t2P+iiLg4HdPPgC3S56xJOUlZLRwD3BARz6f5X5D9FQywKdlf/k9W\nrL+o8sOSviTpwfSl/zwwkuyv6jyerZh+CdggTY8BPlzRyeF5YB+yv+I7kXSUpOWpbPQ/3ezjebJr\nbWs+GxFfjYiNgavIWkntFld+UNKmkn4h6UlJLwCXVxzbFsBTXfa1iO5tA2zZ5XhOASq/sLuei+Ht\npdEB2JKs48oLZOd0ry4xHAVsltb9IPA+YFEqxb49Ld8aeLSbbY8ha00+U7G9C+j8u19zTBHxcprc\nAGtaQ6uvYpafpOHAh4Ehkp5Ji9cFNpL0FuABsnLR1sCC9P42FZ9/J3AyWSnqwbTsOfr3V3+lxWRl\nwknVVoyIK4Arenn/JUm3k7UIb662uS7zU8kS3Jsj4gVJ7wfOTe89Q5YEKm1D1hLtajHwWETkbWFW\niyuvw4G7IuLldH1sVkS8p9sdRMwFDlPWYeRzwK/JjmcxXa5DJouBV8hKsP2Jz490aEJuSVnRPkCW\nhHYg6+X2tjR9G3BMRLSRtTamSFpf0o50tLIg+6t4JfBPSetK+jowopf95U1elwOHSHq3pCGShqeO\nCK/v09F1OBk4XtLJkjYFkLQVsG2Vz40AXgSWSdoS+ErFe38GVkn6nKR1JB1OVtbrzl/SNk5Ox7KO\npJ3UexfxynP1LLBdlVjXrC/p9ZImk5XqTkmLZwDjJH1M0lBJw5R1y39Tmj5K0siIWA0sJ/t3ATAN\nOE7SRGVeL2l8RDwL3AB8T9KI9N52kiZUibPd33Ickw0yTlJWtGOAiyPiqYhY0v4CfggcncpNnyX7\nsn4GuDi92l0PXEfWylpIVqbqVDLrInqY7rxSxJPA+4FTyS7uLwK+TD//D0TEbOAAsutJ81Nr7w9k\nF+/P7eWjpwO7kZXLppNdw2nf5kqylspxwHPAEZXvd9l/G3AI2TW3hcAS4CdkpdEew66Y/hbwtVRW\nO6mH9bdIJc/lZElxJ2C/dD2PiHgReDfZdbCn0+tbZC1ngI8DC1NZ85Nk1wWJiDvSMX4fWErWeaS9\nNX1M+vyD6Rz8Gtg85zH9ADgi9TT8fi+fsUFE/WtVm5mZ1Z5bUmZmVlpOUmZmVlpOUmZmVlqDogu6\nJF84MzNrchGxVm/dQZGkAC68sDny1PTpUzjkkCmNDqNuWu14wcfcClrteKH2xzxpUvd3k7jcZ2Zm\npeUkZWZmpeUkVWfjxu3f6BDqqtWOF3zMraDVjhcad8yD4mZeSdEs16TMzGxtkyZpcHec6M7XvjaW\nJUt6GiR6cBs9egxnnvl4o8MwM2uoQZ2klixZxGBoCfZHehipmVlL8zUpMzMrLScpMzMrLScpMzMr\nLScpMzMrLScpMzMrLSepOnnggQc48MAD2XTTTVlnnXUaHY6Z2aDgJFUnw4YN48gjj+Tiiy+uvrKZ\nmQGD/D6pgThgjz1YtmTJmvmRo0fzxzvuqNn+xo0bx7hx43j00Udrtg8zs2bTlEmqawKCtZPQsiVL\nuHPTTdfM795l/XonMTMzW1tTJqmuCQjWTkJ93UZfP29mZgPna1I1csUVVzBixAhGjhzJ+973vkaH\nY2Y2KDVlSyqPkaNHd2odjRw9utDtH3XUURx11FGFbtPMrNU0ZZLqmoDal1VqxPWlFStWsGLFCiKC\nFStWIIl111237nGYmQ0WTZmkikhARbe0Fi1axLbbboskJLH++uszduxYHnvssYGGambWtBqapCRt\nBVwKbA6sBn4SEec0MqZ2Rbe0xowZQ1tbW6HbNDNrdo1uSa0CToqIeyRtAMyVdENEPNzguMzMrAQa\n2rsvIp6NiHvS9IvAQ8CWjYzJzMzKozRd0CWNBXYGbm9sJGZmVhaNLvcBkEp9vwG+kFpUa5k+fcqa\n6XHj9mf8+P3rEpuZmRVv/vxZLFgwq+p6DU9SkoaSJajLIuLqntY75JApdYvJzMxqa/z4zo2NGTNO\n73a9MpT7LgYejIgfNDoQMzMrl4YmKUn7AEcDB0i6W9Jdkg5sZExmZlYeDS33RcRswE8ANDOzbpWh\n3GdmZtYtJ6ka+tGPfsQee+zB8OHDOf744xsdjpnZoNOSSequu6By/Nk//hFefbX4/Wy55ZZ87Wtf\n44QTTih+42ZmLaDpklQEzJ6d/QR46aUsKVV66CGYNClLVJdeCueeC8uXr72d3ubzOOywwzj00EMZ\nNWpU3z9sZmaNv0+qaC+9BOecA/PmwTHHwOc/D9tvD7vu2rHO0UfD6tVw0EEwfDj87newySYd7y9Y\nAD/8IZx1Fqy/Plx0Eay3Hnz84/U/HjOzVtZ0LanXvhbOPx/+8AeYMAHGjoWvfKVv23jjG2HUKDjx\nxCxZXXddltDMzKy+mq4lBVnraNiwbHrUKJA6v//zn8NVV2WJ7LrrstLfRRd1tKaGDIGvfx323BPu\nvBOuvrpzS8vMzOqj6VpSL7+clfh22QVuuAFuvhl+/OPO6+ywA1x4IYwenZUEP/c5GDGi8zoXXwzb\nbAN77w1nnplt18zM6qvpktS668LBB8Opp2atqPPPz8p3lXbdNUtQ7Q44IPtcu4cfhuuvh5/8BH7w\nA9h886z11VerV6/mlVdeYfXq1axatYoVK1awevXq/h2YmVkLUvSn21qdSYoLL1w7zkmTRK3if/XV\njsTV1pa9hvaxOHr66adz+umno4p64+TJk/n6179e9bOS6O6YzcyaUfo+V9flTXlNqgiVLashQ7JX\nX02ePJnJkycXF5SZWYtpunKfmZk1DycpMzMrLScpM+ukra33ebN6cpIyszXa2rKhwhYtyuYXLcrm\nnaisUdxxwszWGDIEJk7MhgrbbTeYOxcOP7x/HYfMitBjkpJ0TY7PPxcRnyguHDNrtDFjsgR1663w\nzndm862qra1zgu46b7XXW0tqB+A/enlfwI+KDadvRo8e0+kepGYyenQLfzNYQy1alLWg3vnO7OeY\nMa2ZqNpLnxMnZse/aBHMnJmNUuNEVT+9JanTIuLm3j4s6fSC4+mTM898vJG7N2s6bW3ZF/Hhh3ck\np1b9YnbpsxwG9YgTZla8RpS4ylxWu+WWjtLnhAn9306Zj7EMehpxosdTJGm6pGt6etU2XDNrlK5f\nnPVIUGXtUdi19NkeY1+V+RjLrrdy33+nn4cDmwOXp/mPAn+rZVBm1jrKWlYrsvRZ1mMcDKqW+yTd\nGRG7V1tWSy73mRWjzCWnospqRcpzvvpyTst4jGXR53JfhddK2q59RtK2wGuLDM7Maq/MJaeiympF\nq1b67Ms5Lesxll2em3lPBGZJeizNjwUm1SwiM6uJspacBnOPwrzndDAfY6Pl6t0naT3gTWn24YhY\nUdOo1t6/y31mBSljyanMZcg88pzTwX6Mtdbvcp+k1wBfAT4bEfcC20g6uAYxmlmNFVlyWrWq9/lm\nkGew3bznNE+vSQ/uu7Y8efwS4FVg7zT/JPCNmkVkZjVRWXKaMCH7OXNm/74IV62CKVNgzpxsfs6c\nbL4/iaqs18ryxFXkOS3reWi03L37JN0dEbukZfdGxNvqEiEu95kVpciS05w58MtfwpvfDPffD0ce\nCXvt1b9tLVq09nWdMgzFlCeuIs9pWc9DPQykd9+rktYHAkDSG4C6XpMys2IUeaPunntmCeqee7Kf\ne+7Z/21VDmq7224D+2LOUzLLW1bLE1eR57TI89As8pzOKcB1wNaSfg7cBJxcy6DMrNza2uDss+G+\n+2DnnbOfZ5/d/9JUPUd2KHO3cXdTX1vVLugRcYOkucBeZCOffyEi/lHzyMystNra4B//gI03hu23\nh8WLs/n+lLrqPbJDWbuNu5t69/Jck7oJODsi/lCx7McR8claB1exP1+TslIo8vpD3m3Vu+vyqlUw\ndGjP85XL//Snjq7X73jH2usVeYxFj+xQxm7jrdxNfSDXpLYFvippcsWyug2JZFYWRfa+yrutevf4\n6kuvvaee6lyaeuqp/sde75Ediuw2XqR6728wyDPixAvAu4BzJE0HPlbbkMzKqcgRG/Juq96jRAwd\nCgcfnPXae+CBjl573bWQqpWmGnG+8sTlstrgkqfcV9n1/BPAl4CNI2Kr2oe3JgaX+6w0iiwT5R39\nod6jREyblvXa23lnOOGE7tcp8hjrva28Jc1WLr/V20DKfRe0T0TET4FPADcUFpnZIJKnTJS3NJW3\n5FTvHl9z5mQtqJ13zn62l/66ylOaasT5ylM6vPzyzvu7/PLGl1qtez2W+ySNjIhlwK8ljap4ayHw\n5aICkDQNOBj4W0S8tajtmhUtb5koT2kq77bqXZpatQpmzOi4MXfOnGx+9927b2n0phHnK4+yllqt\nez2W+yTNiIiDJS0ku5G3shkWEbFdIQFI+wIvApf2lKRc7rOyKLKH2WDv3ZdHI85XXmUttbaqPpf7\nIuLg9HPbiNgu/Wx/FZKg0vZvA54vantmtZS391We0lTebdW7x1fXhNTfBNUXZb1p1jfXNl6P/9wl\n7drbq55Bmg0mRQ46Opj1pZt9tfNVdPf/PL8f/x7Lobdy38w0OZzsvqh7yUp+bwXujIi9u/1gf4KQ\nxgDTeyv3HXxwx21a48btz/jx+xe1e7PCuVdYJu+AqXnOV5GDr5a11NpK5s+fxYIFs9bMz5hxerfl\nvjxd0H8HTI6IeWn+zcCUiPhQUcHmSVK+JmXNJu8XYKOuERWlyGs6vj7UvAbSBX18e4ICiIj7gR2K\nDI6shbZWcGbNKm/5arA/t6nIazq+PtSa8vw9Nk/SRcDlZL38PgbcV1QAkq4A9gc2kfQEWavtkqK2\nb1ZGebs35x0Bosh9FqXIbuMeJaJ15Sn3DQc+DbQ3rm8Bzo+IV2ocW2UMLvdZ02lrg9tu6yhf7btv\nz9dFLrmkYwSI446r/eCrRWnEgLw2OPWr3CdpHWBaRHwvIj6QXt+rZ4Iya0ZtbXDeeTB7dpYsZs/O\n5rvrYVbtuU1lfj5Skd3nPfhqa+r11xwRq4ExktatUzxmLUPqfR7Wfm7Txht3PLepXWUZ75Zbsp8T\nJ/Y++Kq7VNtgkafcdylZR4lrgH+1L4+I79Y2tE4xuNxng0qeHnl5y315n9uUt3RY1HObXH6zIg2k\nd9+jwIy07oiKl5l1I2+PvMWLO5feFi/ufnt5ntt0/vmdS4fnn1/b5zZ58FWrlzyPjz+9HoGYNYs8\nPfKKHmC2a0GkSoGkRx581comT7lvU+BkYCey0ScAiIgDahtapxhc7rNBp9ozmYp+tHqecl9eHnzV\n6m0g5b6fAw+TPUb+dOBx4I5CozOroe5KVbWW95lMeRT13Ka8PPiqlUmeJLVJREwDVkbEzRFxPFC3\nVpTZQDTi2knlM5lOOCH7OWNG52tSRca1alXWatt776w1s/fe2Xx/R6Xw4KtWJnnKfXMiYi9J1wPn\nAE8Dv4mIN9QjwBSDy33Wb0UOTJpXnt59Rcb1+ONw1VUd2/rAB2Ds2P5ty737rBF6KvflGVzlG5I2\nBL4EnAuMBE4sOD6zmhkzJvvybr92UusEBflKdEXGNXZs5231N0FBeZ9zZa2p6j+riJgREUsj4v6I\nmBgRu0XENfUIzqwI9b52kreU58FXzarrsSUl6VyyAWW7FRGfr0lEZgVqxMCkebpne/BVs3x6e+jh\nsWlyH2BH4Jdp/gjgwYj4VO3DWxOLr0lZvzXi2kmeLuEefNWsQ5+vSUXEzwAkfRrYNyJWpfkLgFtr\nFahZ0ep97aR9BIhlyzpGgJg3Dz796c779uCrZtXl+ae8MVlniXYbpGVm1oOiRoAwa3V5evd9C7hb\n0sw0vx8wpWYRmQ1yQ4bAZz5T33KfWbPK07vvEuDtwFXptXd7KdDMuldt8FgP0GqWT96/29YB/g48\nD4yT5FG6zHqQZzSGvM+AMmt1Vct9ks4CjgQeANr/mwXZY+TNamIwl8KGDOnc/XvMmO67g+e9mXcw\nnwuzgcrzT/0wYHxEvC8iDkmvQ2sdmLWuZiiFFTUobDOcC7OByNNx4jFgGLCixrGYAa3xrKK8N+C2\nwrkw602eJPUScI+km6hIVB5xwmqpEePt1VPekmD7e818Lsx6kydJXZNeZnXTtRTW3tpoJnlvwG2F\nc2HWkzyPj3d3c6srj0XXwefCWl2e50ltD0wlG7+v8vHx29U2tE4xeOy+FuMebR18LmwwmjYNlsx9\nIvf6j68e0+/nSV0CTAa+B0wEjiP//VVma/GXbt94XD6rl1ty3lg0+8p8yWfh1vvBKafkWleTul+e\nJ0mtHxE3SVJELAKmSJoLfD3Xns0qtHepnjgxK10tWrR2+SrPOmaWT18Tz+h1/ll13X2GP87l3/17\njq3mS1C9yZOkXpE0BHhE0meBp8gGmTXrszxdqt3t2qx306blW2/J3CdyJR3oS+KprzxJ6ovAa4DP\nA2eSlfyOqWVQ1tzydKl2t2trRdOmwZIlVVZanCWe7Yc9XnV7J2x0B5/85tgiQmuYPElqbETcAbxI\ndj0KSUcAt9cyMGteebpUu9u1NYupU3OuuDgrt52y0QW9r7cRfUg8edcrrzxJ6hTg1zmWmVWVp0u1\nu11b2U09dVm+FV94AciReKAi+Yztb1hNqbfHx78XOAj4MB2PjofsAYg7RsSetQ9vTSzugt5E8vTu\ncw9Aq7e+Jp6FW++Xb/2cvdtanSZN6nMX9KeBO4FDgbkVy5cDJxYbnrWSPF2q3e3aijL11GXwysu9\nr/RKNuJbrsQzgpR4nHzqocckFRH3AvdKuiIiVgJI2hjYOiKer1eAZmZd5Uo8ACtXwerVLNztiOrr\nnnACTjzlk+ea1I2SDk3rzgWWSPpTRLg1ZWaFmXrqMli+PN/KeRPP9ttnT57khAHFZo2TJ0ltGBHL\nJP0HcGlETJZ0X60DM8vD167Kbeqpy9Zcw8lj4W5HZImlGieelpEnSQ2VtAVZB4rTahyPWW4emaJx\npk5lTZfpahbudkQqpeXhxGOd5UlSZwDXA7dFxB2StgMeqW1YZtV5ZIpi9SXxQF/GZXPisf7L86iO\nX1NxT1REPAZ8sKgAJB0IfJ9s0NppEXFWUdu25ueRKXpXu8QD7mRg9dBjkpL0yYj4cW8fzrNOlc8P\nAX4IvIusy/sdkq6OiIf7u01rLc04MkW1AUFnz8aJx1pGby2p/yvpH728L+ALQL+TFLAn8EgaXR1J\nVwLvB5ykrKrBNDJFkQOCjgZu3/pwJx5rCb0lqZuBQ6p8/sYB7n9LYHHF/JNkicusqiFDOiekMWPq\nm6D6mniKHRDUicdaQ2838x5Xh/2vNQQG0O34R9OnT1kzPW7c/owfv39tIrJBpeiRKfoyGGhtRqLO\nu57Z4DZr/nxmLVhQdb2qj4+vJUl7AVMi4sA0/3+B6Np5wmP32UDlSj4p8ZwwIt/YyYP9EQhmZdKf\nsfvq4Q7gjZLGAM8AHwE+2tiQbLAoeiTqT279i3SdZ+zAAjOzwjQ0SUXE6vS03xvo6IL+UCNjssbK\nPSZbvwYEHVtlRV/nMSubqklK0npk90WNrVw/Is4oIoCIuA4YX8S2rJymnvS3fCu2J548Y7KBBwQ1\nawF5WlJXA0vJBpddUdtwbLCYetLfshGmq1m9Guhr4vEIBWaWyZOktmrv2GDNL9dI1O2J5yOn5tuo\nBwM1s37Kk6T+JOktETGv5tFYTfR5JOo8yWfCBGBC/4MyM8uht2GR5pHdszQUOE7SY2TlPpF1E39r\nfUK07vQr8UzIm1ScfMysHHprSR1ctygMSNd5Xsl/2c+Jx8yaXW8jTrSPp3dZRHy88j1JlwEf7/aD\nLaTaQKDt+jIgqBOPmVmHPNekdqqckbQOsFttwmm8viaeaoOBQhoQdLdP5XzwmxOPmVm73q5JnQKc\nCqwvqf3WfgGvMrCRz+vullvgkRyPaVyyhBolHnDvNjOzvuut3DcVmCppakSU9o7JaiNRL3k062Cw\nz/C5Vbe1PXD5bt9y4jEzK4mqA8xK2rWbxUuBRRGR427OgZMUY8d2E+fiJ3Iln8t36kviMTOzehvI\nALPnAbsC95GV+94C3A9sJOlTEXFDoZH24JTla9+70zEgaDVOUGZmg1GeJPU0cEJEPAAgaUfgDOBk\n4Hdkg8PWXPePRShtFdLMzAqQ5xFx49oTFEBEPAi8KSIeq11YZmZm+VpSD0g6H7gyzR8JPJhGR19Z\ns8jMzKzl5WlJfQL4K/BF4ETgsbRsJTCxVoGZmZlVbUlFxMvA2enV1YuFR2RmZpbkeejhPsAUYAyd\nH3q4Xe3CMjMzy3dNahpZmW8usLq24ZiZmXXIk6SWRsS1NY/EzMysizxJaqak75DdE7XmORIRcVfN\nojIzMyNfknp7+rl7xbIADig+HDMzsw55eve5m7mZmTVE1fukJG0maZqka9P8jpI8GJ6ZmdVcnpt5\nfwpcD7w+zS8gu7HXzMyspvJck3pdRPwqPQSRiFglyV3RbS0HfPObLFu+fM38yBEj+OOpa49eP9j3\naWb1kydJ/UvSJmSdJZC0F9nzpMw6WbZ8OXdusMGa+d0rkkcz7dPM6idPkjoJuAZ4g6TZwKbAh2oa\nlZmZGfl6990laT9gPNlDD+dHhEc/NzOzmusxSUk6vIe3xkkiIn5Xo5hskBo5YkSnctvIESOacp9m\nVj+KiO7fkC7p5XMREcfXJqRuY4m48MJ67c7MzOpMkyYREeq6vMeWVEQcV9uQzMzMepen44RZadW7\nC/qWn/scrFrVsWDoUJ4699ya7Q/czd5am5OUDWp174K+ahVPDe34b7NlZcKqEXezt1aWZ8QJMzOz\nhuhP7z4A9+5rMXlKTkWWwjb51KcYVtGpZ6XEPy+4YK31nly6lN2Xdtxb/mS/9mZmZdVbue+QXt4L\nsudLWYvIVXIqsBQ2LIJn1dHRZ/MeeqEOAy6tmH9Pv/eY09ChnY9raO0r5u5mb63MvftsUNtsww3Z\nsSJ5bvbiizXdX607SXTHnSSsleX6M1DS+4CdgOHtyyLijIHsWNKHgCnADsAeftJvYzSi51jeUl5b\nD62nSoufe457n3uuY76bdfKWIetd0szLvfuslVVNUpIuAF4DTAQuIhu37y8F7Hse8AHAd+k2UN6e\nY7lKTjlLYXlKeSvoeDZM+3x3VgIndJlfS84yZL1Lmnm5d5+1sjwtqXdExFsl3RcRp0s6G7h2oDuO\niPkAkta6w9jKJ89f7kW2KN4walTnL+YeynjrAnfmuHZlZoNTniT1cvr5kqTXA/8EtqhdSFZNkeWf\nx557ji0rymUv97JuNX0phVUr5S187jneVhFXb732VlfZ1uq2Nh589dWO+V7XLoZLdGbFyJOkZkja\nCPgOcBdZz76L8mxc0o3AZpWL0udPi4jpfYzVkiLLP+sCf62Y37b/YeUuheUp5Q0DflExf0APu1wB\nbFllWyuBj3aZ706RJc0if0fu3WetLE+S+nZErAB+K2kGWeeJV/JsPCL+fSDBVZoyvSOn7T9uHPuP\nH1/UplvaOkOGsH7FF+06dbjGkqeUt86QIeyYI67XDBlSNTFum7N0WO+SZl5ugVkzmjV/PrMWLKi6\nXp4k9WfGXRORAAAMNklEQVRgV4CUrFZIuqt9WUGqXpeackhvt22Zmdlgsv/48Z0aG6fPmNHter2N\nOLE5WSVlfUm70JFIRpL19hsQSYcB5wKvIysp3hMR7x3odlvBwuefZ/OK6zUre+h7kuu6SM7yVZHb\nylO+eiWCzSuuI/V0jHn2WWS5LO+1pmdefJEtX3ih17jMrLre/ue8B/gEsBXw3Yrly4AB1x8i4vfA\n7we6nVY0XOKpYcPWzA+kS3Xe8lWR28pTvtp2441zlejy7LPIclnea01bbLBBrvjNrHe9jTjxM+Bn\nkj4YEb+tY0xmZmZAvmtSsyVNA14fEe+VtCOwd0RMq3Fs1sL+tnQpD1YMHPu3BsYyGLjLuzWrPEnq\nkvQ6Lc0vAH4JOEk1SoHXfvKqdzfolcAxXebLIO95qPf58qgU1qzyJKnXRcSvJJ0CEBGrJNXjfkjr\nQZHXfvKq91/lW224YSmv6eQ9D27FmBUjT5L6l6RNyG7CRdJewNLeP2L95bKNmVmHPEnqJOAa4A2S\nZgObkg0yazXgsk3Goyz0jc+XNauqSSoi7pK0HzCe7F6p+RFRlksE1qTceuwbny9rVnke1TEc+Ayw\nL1nJ71ZJF0RErqGRrNxcXjSzMstT7rsUWE42OgRkY3VeBhxRq6BamXuFmZl1yJOk3hwRO1bMz5T0\nYK0CanVuxZiZdRiSY527Uo8+ACS9HbizdiGZmZll8rSkdgP+JOmJNL8NMF/SPCAi4q01i85qzr3C\nzKzM8iSpA2sehTWMy4tmVmZ5uqAvqkcgZmZmXeW5JmVmZtYQTlJmZlZaTlJmZlZaTlJmZlZaTlJm\nZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZa\nTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJmZlZaTlJm\nZlZaDUtSkr4t6SFJ90j6raSRjYrFzMzKqZEtqRuAnSJiZ+AR4JQGxmJmZiXUsCQVEf8bEW1pdg6w\nVaNiMTOzcirLNanjgWsbHYSZmZXL0FpuXNKNwGaVi4AATouI6Wmd04CVEXFFb9uaMn36mun9x41j\n//Hjiw/YzMzqYtb8+cxasKDqeoqIOoTTw86lY4FPAgdExIpe1ou48ML6BWZmZnWlSZOICHVdXtOW\nVG8kHQicDEzoLUGZmVnrauQ1qXOBDYAbJd0l6bwGxmJmZiXUsJZURGzfqH2bmdngUJbefWZmZmtx\nkjIzs9JykjIzs9JykjIzs9JykjIzs9JykqqzWfPnNzqEumq14wUfcytoteOFxh2zk1Sd5RkGpJm0\n2vGCj7kVtNrxQuOO2UnKzMxKy0nKzMxKq6EDzOYlqfxBmpnZgHQ3wOygSFJmZtaaXO4zM7PScpIy\nM7PScpIyM7PScpKqM0nflvSQpHsk/VbSyEbHVGuSPiTpfkmrJe3a6HhqRdKBkh6WtEDSVxsdTz1I\nmibpb5Lua3Qs9SBpK0l/lPSgpHmSPt/omGpN0nqSbpd0dzrmyfXcv5NU/d0A7BQROwOPAKc0OJ56\nmAd8ALi50YHUiqQhwA+B9wA7AR+V9KbGRlUXl5Adc6tYBZwUETsCewP/2ey/5/Tk9IkRsQuwM/Be\nSXvWa/9OUnUWEf8bEW1pdg6wVSPjqYeImB8RjwBrdS9tInsCj0TEoohYCVwJvL/BMdVcRNwGPN/o\nOOolIp6NiHvS9IvAQ8CWjY2q9iLipTS5HtnDcuvWLdxJqrGOB65tdBBWiC2BxRXzT9ICX16tTNJY\nspbF7Y2NpPYkDZF0N/AscGNE3FGvfTfs8fHNTNKNwGaVi8j+8jgtIqandU4DVkbEFQ0IsXB5jrnJ\ndddK9E2ITUrSBsBvgC+kFlVTS9WfXdI19N9L2jEiHqzHvp2kaiAi/r239yUdCxwEHFCfiGqv2jG3\ngCeBbSrmtwKeblAsVkOShpIlqMsi4upGx1NPEbFM0izgQKAuScrlvjqTdCBwMnBouiDZapr1utQd\nwBsljZG0LvAR4JoGx1Qvonl/r925GHgwIn7Q6EDqQdLrJG2YptcH/g14uF77d5Kqv3OBDYAbJd0l\n6bxGB1Rrkg6TtBjYC5ghqemuw0XEauCzZL03HwCujIiHGhtV7Um6AvgTME7SE5KOa3RMtSRpH+Bo\n4IDUJfuu9IdnM9sCmCnpHrLrb9dHxB/qtXOP3WdmZqXllpSZmZWWk5SZmZWWk5SZmZWWk5SZmZWW\nk5SZmZWWk5SZmZWWk5Q1PUn7SVpraKaelhewv/dXjowtaWa1R5SkWF6QNKPKeoWOmi9p+QA/f6yk\nc9L0JEkfKyCmhZJGSRqe7kV6RdKogW7XBicnKWsVPd0QWIsbBQ8je1xHX90SEQdXWefUfmy3N306\nfkk9jiwRERdGxOUDDymLKSJeSY+H8PBSLcxJyhpO0mskzUh/Nd8n6Yi0fFdJsyTdIelaSZul5TMl\nfb9i/d3T8j0kzZY0V9JtkrbvYwzT0sPd5ko6JC0/Nj2c8lpJ8yWdVfGZE9KyOZJ+LOlcSXsDhwLf\nTqMRbJdW/3Da9sNp1IJq8Wwu6ea0jfsk7SNpKrB+WnZZWu+qdH7mSfqPis8vl/QNZQ/X/JOkTdPy\nsWn+XklnVqz/Wkn/K+nO9N6hafmYFPPPJM0DtpJ0XPtxA/tUbGOypJMkbVExGsPdklZJ2joNr/Ob\ndB5ul/SO9LlRkq5Px/AT1h5iqZWGXLKuIsIvvxr6Ag4HLqyYH0E2+PFsYJO07MPAtDQ9s3194J3A\nvDS9ATAkTb8L+E2a3g+4ppv9rlkO/BdwVJreEJgPrA8cC/w1bXs94HGyR3BsASxM664D3AKckz5/\nCXB4xX5mAt9J0+8le9RBj7Gk+ZOAU9K0gNem6WVdPrdR+jmc7OGSG6f5NuCgNH0WcGqavho4Ok1/\npn176Rg2SNObkD0bC2AM2YP+9kjzmwOLgFHpd3RbxXFPJnsgYGV8nwF+kaZ/DrwjTW9NNv4dwA+A\n/5emDwJWA6MqtrGwct6v1np5FHQrg3nAd1JL4X8i4jZJOwFvJhvjUGSt/sqyzy8AIuJWSSOUPUJg\nJHBpakEFfRvl/93AIZK+kubXpWNU85siPY5B0gNkX9ybArMiYmla/mugt5bb79LPuenz1dwBTJM0\nDLg6Iu7tYb0vSjosTW+VYvgLsCI6xlebSzYoKGQtn8PT9GXAt9K0gKmSJpAluNdLGp3eWxQdzw96\nOzAzIp4DkPRLejju1GI8Adg3Lfo3YIeKkuEGyh55MYHsyc1ExB8ktcxDFK06JylruIh4RNJuZH9F\nnynpJuD3wP0R0VNprOu1lADOBP4YEYdLGkPWgslLwAcje4Jwx0JpL6BytPo2sv83fR35u30bq8nx\n/y4l3wnA+4CfSjo7sus9a/YpaT+yx728PSJWSJpJ1qICWFmxucp9Bh3nrjL+o4HXAbtERJukhRXb\n+lfOY1xD0hbAT4BDIuLliv3tFRGvdlm3MqaucVmL8zUpa7j0hfZyZA+A/G9gV7Jy26YpSSBpqKQd\nKz52ZFq+L7A0IpaTld6eSu/3dTTu64HPV8S0c5X1/wJMkLShsucLfbDiveVkrbqeVP0SlrQN8PeI\nmAZcRHZOAF6VtE6a3hB4PiWoN5GNMl9tH7OBj6bpoyuWbwgsSQlqIp1be5Xbuh3YT9LGqZV3RDex\nDwV+CXw1Ih6teOsGOp/jt6XJW4CPpWXvBTbqIXZrQU5SVgZvAf6i7PHUXwe+ERErgQ8BZyl7RMDd\nwN4Vn3lF0l3AecDxadm3gW9Jmkvf/22fCQxLnRTmAWf0sF57z7OngW+SJatbya6bLE3rXAl8JXXA\n2I7uW33V7A/ck47xw2TXbQB+DMxLHSeuTTE/kGL5c459fBH4T0n3kl1Xa/dzYI+0/GNA5WNG1mwr\nIp4FpgBzyI67uwffvQPYHTi9ogPF5sAXgN1Tx4z7gUlp/TPIEv48sp6RT/QQu7UgP6rDBp1U1vpS\nRNzV4DheGxH/Si2bq8g6dvTrSa2pdPfliDik0CCbQCo97tZ+Hcxai1tSNhiV5S+rKan1Nw94rL8J\nKnkV2ElVbuZtJUo385L1PGxrdDzWGG5JmZlZabklZWZmpeUkZWZmpeUkZWZmpeUkZWZmpeUkZWZm\npfX/ASaqtJ+9peFgAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fd9b668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1120486a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ada = AdalineGD(n_iter=15, eta=0.01)\n",
    "ada.fit(X_std, y)\n",
    "\n",
    "plot_decision_regions(X_std, y, classifier=ada)\n",
    "plt.title('Adaline - Gradient Descent')\n",
    "plt.xlabel('sepal length [standardized]')\n",
    "plt.ylabel('petal length [standardized]')\n",
    "plt.legend(loc='upper left')\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "plt.plot(range(1, len(ada.cost_) + 1), ada.cost_, marker='o')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Sum-squared-error')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Large scale machine learning and stochastic gradient descent"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from numpy.random import seed\n",
    "\n",
    "class AdalineSGD(object):\n",
    "    \"\"\"ADAptive LInear NEuron classifier.\n",
    "\n",
    "    Parameters\n",
    "    ------------\n",
    "    eta : float\n",
    "        Learning rate (between 0.0 and 1.0)\n",
    "    n_iter : int\n",
    "        Passes over the training dataset.\n",
    "\n",
    "    Attributes\n",
    "    -----------\n",
    "    w_ : 1d-array\n",
    "        Weights after fitting.\n",
    "    errors_ : list\n",
    "        Number of misclassifications in every epoch.\n",
    "    shuffle : bool (default: True)\n",
    "        Shuffles training data every epoch if True to prevent cycles.\n",
    "    random_state : int (default: None)\n",
    "        Set random state for shuffling and initializing the weights.\n",
    "        \n",
    "    \"\"\"\n",
    "    def __init__(self, eta=0.01, n_iter=10, shuffle=True, random_state=None):\n",
    "        self.eta = eta\n",
    "        self.n_iter = n_iter\n",
    "        self.w_initialized = False\n",
    "        self.shuffle = shuffle\n",
    "        if random_state:\n",
    "            seed(random_state)\n",
    "        \n",
    "    def fit(self, X, y):\n",
    "        \"\"\" Fit training data.\n",
    "\n",
    "        Parameters\n",
    "        ----------\n",
    "        X : {array-like}, shape = [n_samples, n_features]\n",
    "            Training vectors, where n_samples is the number of samples and\n",
    "            n_features is the number of features.\n",
    "        y : array-like, shape = [n_samples]\n",
    "            Target values.\n",
    "\n",
    "        Returns\n",
    "        -------\n",
    "        self : object\n",
    "\n",
    "        \"\"\"\n",
    "        self._initialize_weights(X.shape[1])\n",
    "        self.cost_ = []\n",
    "        for i in range(self.n_iter):\n",
    "            if self.shuffle:\n",
    "                X, y = self._shuffle(X, y)\n",
    "            cost = []\n",
    "            for xi, target in zip(X, y):\n",
    "                cost.append(self._update_weights(xi, target))\n",
    "            avg_cost = sum(cost)/len(y)\n",
    "            self.cost_.append(avg_cost)\n",
    "        return self\n",
    "\n",
    "    def partial_fit(self, X, y):\n",
    "        \"\"\"Fit training data without reinitializing the weights\"\"\"\n",
    "        if not self.w_initialized:\n",
    "            self._initialize_weights(X.shape[1])\n",
    "        if y.ravel().shape[0] > 1:\n",
    "            for xi, target in zip(X, y):\n",
    "                self._update_weights(xi, target)\n",
    "        else:\n",
    "            self._update_weights(X, y)\n",
    "        return self\n",
    "\n",
    "    def _shuffle(self, X, y):\n",
    "        \"\"\"Shuffle training data\"\"\"\n",
    "        r = np.random.permutation(len(y))\n",
    "        return X[r], y[r]\n",
    "    \n",
    "    def _initialize_weights(self, m):\n",
    "        \"\"\"Initialize weights to zeros\"\"\"\n",
    "        self.w_ = np.zeros(1 + m)\n",
    "        self.w_initialized = True\n",
    "        \n",
    "    def _update_weights(self, xi, target):\n",
    "        \"\"\"Apply Adaline learning rule to update the weights\"\"\"\n",
    "        output = self.net_input(xi)\n",
    "        error = (target - output)\n",
    "        self.w_[1:] += self.eta * xi.dot(error)\n",
    "        self.w_[0] += self.eta * error\n",
    "        cost = 0.5 * error**2\n",
    "        return cost\n",
    "    \n",
    "    def net_input(self, X):\n",
    "        \"\"\"Calculate net input\"\"\"\n",
    "        return np.dot(X, self.w_[1:]) + self.w_[0]\n",
    "\n",
    "    def activation(self, X):\n",
    "        \"\"\"Compute linear activation\"\"\"\n",
    "        return self.net_input(X)\n",
    "\n",
    "    def predict(self, X):\n",
    "        \"\"\"Return class label after unit step\"\"\"\n",
    "        return np.where(self.activation(X) >= 0.0, 1, -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n8O9J9ceh++zDimXL1s6PGDWKP95xR832N27cOMaNG8ejjz5as32YmTWbpkxSXRMQrJ+EVixbxp1b\nbbV2fu8u69c7iZmZ2fqaMkl1TUCwfhLq7TZ6+3ozM+s/X5Oqkauuuorhw4czYsQI3v/+9zc6HDOz\nAakpW1J5jBg1ap3W0YhRo6q6/eOOO47jjjuuqts0M2s1TZmkuiagjmWlGnF9afXq1axevZqIYPXq\n1Uhigw02qHscZmYDRVMmqWokoGq3tJYsWcJOO+2EJCSx0UYbMXbsWB577LH+hmpm1rQamqQkbQ9c\nAWwDtAE/jogfNDKmDtVuaY0ZM4b29vaqbtPMrNk1uiW1Bjg1Iu6RtCkwX9JNEfFwg+MyM7MCaGjv\nvoh4JiLuSdMvAQ8BoxsZk5mZFUdhuqBLGgvsAdze2EjMzKwoGl3uAyCV+n4BfD61qNYzY8aUtdPj\nxh3C+PGH1CU2MzOrvoULZ7No0eyK6zU8SUkaQpagroyI3/S03hFHTKlbTGZmVlvjx6/b2Jg586xu\n1ytCue8y4MGI+H6jAzEzs2JpaJKSdABwPHCopLsl3SXpsEbGZGZmxdHQcl9EzAV8B0AzM+tWEcp9\nZmZm3XKSqqH//u//Zp999mHYsGGcfPLJjQ7HzGzAackkddddUDr+7B//CK++Wv39jB49mq997WtM\nnDix+hs3M2sBTZekImDu3OwnwMsvZ0mp1EMPwaRJWaK64gq44AJYuXL97ZSbz+Ooo47iyCOPZOTI\nkb1/sZmZNf57UtX28svwgx/AggVwwgnwuc/BLrvAnnt2rnP88dDWBu97HwwbBr/8JWy5ZefzixbB\nD38I550HG20El14KG24In/hE/Y/HzKyVNV1LapNN4KKL4Le/hYMOgrFj4Stf6d023vAGGDkSvvjF\nLFndcEOW0MzMrL6ariUFWeto6NBseuRIkNZ9/mc/g1/9KktkN9yQlf4uvbSzNTVoEHz967DvvnDn\nnfCb36zb0jIzs/poupbUK69kJb63vQ1uugluuQV+9KN119l1V7jkEhg1KisJnnIKDB++7jqXXQY7\n7gj77w/nnJNt18zM6qvpktQGG8Dhh8MZZ2StqIsuysp3pfbcM0tQHQ49NHtdh4cfhhtvhB//GL7/\nfdhmm6z11VttbW2sWrWKtrY21qxZw+rVq2lra+vbgZmZtSBFX7qt1ZmkuOSS9eOcNEnUKv5XX+1M\n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\nrLMEkvYju5+U2TpWrFzJnZtuunZ+75Lk0Uz7NLP6yZOkTgWuB14vaS6wFfDhmkZlZmZGvt59d0k6\nGBhPNsAlGQFYAAAPCklEQVTswoio2+jnZmbWunpMUpJ6umnTOElExC9rFJMNUCOGD1+n3DZi+PCm\n3KeZ1U+PNz2UdHmZ10VEnFybkLqNJeKSS+q1OzMzq7Ne3/QwIk6qbUhmZmbl5ek4YVZY9e6CPvqU\nU2DNms4FQ4bw1AUX1Gx/4G721tqcpGxAq3sX9DVreGpI57/N6NKEVSPuZm+tLM+IE2ZmZg3Rl959\nAO7d12LylJyqWQrb8tOfZmhJp57XJJ67+OL11nty+XL2Xt753fIn+7Q3MyuqcuW+I8o8F2T3l7IW\nkavkVMVS2NAInlFnR59teuiFOhS4omT+PX3eY05Dhqx7XENqXzF3N3trZe7dZwPa1pttxm4lyXPr\nl16q6f5q3UmiO+4kYa0s18dASe8HdgeGdSyLiLP7s2NJHwamALsC+/hOv43RiJ5jeUt57T20nkot\nff557n3++c75btbJW4asd0kzL/fus1ZWMUlJuhjYGJgAXEo2bt9fqrDvBcAHAX9Lt4Hy9hzLVXLK\nWQrLU8pbTee9YTrmu/MaMLHL/HpyliHrXdLMy737rJXlaUm9IyLeIum+iDhL0vnA7/q744hYCCBp\nvW8YW/Hk+eRezRbF60eOXPeNuYcy3gbAnTmuXZnZwJQnSb2Sfr4saTvgOWDb2oVklVSz/PPY888z\nuqRc9kqZdSvpTSmsUilv8fPP89aSuMr12mursK229nYefPXVzvmya1eHS3Rm1ZEnSc2UtDnwbeAu\nsp59l+bZuKTfA1uXLkqvPzMiZvQyVkuqWf7ZAPi/kvmd+h5W7lJYnlLeUODqkvlDe9jlamB0hW29\nBnysy3x3qlnSrObvyL37rJXlSVLfiojVwHWSZpJ1nliVZ+MR8e7+BFdqyozOnHbIuHEcMn58tTbd\n0gYPGsRGJW+0g+twjSVPKW/woEHsliOujQcNqpgYd8pZOqx3STMvt8CsGc1euJDZixZVXC9Pkvoz\nsCdASlarJd3VsaxKKl6XmnJEua9tmZnZQHLI+PHrNDbOmjmz2/XKjTixDVklZSNJb6MzkYwg6+3X\nL5KOAi4AXkdWUrwnIt7b3+22gsUvvMA2JddrXuuh70mu6yI5y1fV3Fae8tWqCLYpuY7U0zHm2Wc1\ny2V5rzX99aWXGP3ii2XjMrPKyv3nvAf4JLA98J2S5SuAftcfIuLXwK/7u51WNEziqaFD1873p0t1\n3vJVNbeVp3y10xZb5CrR5dlnNctlea81bbvpprniN7Pyyo048VPgp5I+FBHX1TEmMzMzIN81qbmS\npgHbRcR7Je0G7B8R02ocm7WwZ5cv58GSgWOfbWAsA4G7vFuzypOkLk+PM9P8IuDngJNUo1Tx2k9e\n9e4G/RpwQpf5Ish7Hup9vjwqhTWrPEnqdRHxP5JOB4iINZLq8X1I60E1r/3kVe9P5dtvtlkhr+nk\nPQ9uxZhVR54k9Q9JW5J9CRdJ+wHLy7/E+splGzOzTnmS1KnA9cDrJc0FtiIbZNZqwGWbjEdZ6B2f\nL2tWFZNURNwl6WBgPNl3pRZGRFEuEViTcuuxd3y+rFnluVXHMOCzwIFkJb9bJV0cEbmGRrJic3nR\nzIosT7nvCmAl2egQkI3VeSVwTK2CamXuFWZm1ilPknpTROxWMj9L0oO1CqjVuRVjZtZpUI517ko9\n+gCQ9HbgztqFZGZmlsnTktoL+JOkJ9L8jsBCSQuAiIi31Cw6qzn3CjOzIsuTpA6reRTWMC4vmlmR\n5emCvqQegZiZmXWV55qUmZlZQzhJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJ\nmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZ\nYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTlJmZlZYTUsSUn6lqSHJN0j6TpJ\nIxoVi5mZFVMjW1I3AbtHxB7AI8DpDYzFzMwKqGFJKiL+EBHtaXYesH2jYjEzs2IqyjWpk4HfNToI\nMzMrliG13Lik3wNbly4CAjgzImakdc4EXouIq8pta8qMGWunDxk3jkPGj69+wGZmVhezFy5k9qJF\nFddTRNQhnB52Lp0IfAo4NCJWl1kv4pJL6heYmZnVlSZNIiLUdXlNW1LlSDoMOA04qFyCMjOz1tXI\na1IXAJsCv5d0l6QLGxiLmZkVUMNaUhGxS6P2bWZmA0NReveZmZmtx0nKzMwKy0nKzMwKy0nKzMwK\ny0nKzMwKy0mqzmYvXNjoEOqq1Y4XfMytoNWOFxp3zE5SdZZnGJBm0mrHCz7mVtBqxwuNO2YnKTMz\n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\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fc9c588>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nIWVmZoX1/wFJD5f9DSScgAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x112454748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ada = AdalineSGD(n_iter=15, eta=0.01, random_state=1)\n",
    "ada.fit(X_std, y)\n",
    "\n",
    "plot_decision_regions(X_std, y, classifier=ada)\n",
    "plt.title('Adaline - Stochastic Gradient Descent')\n",
    "plt.xlabel('sepal length [standardized]')\n",
    "plt.ylabel('petal length [standardized]')\n",
    "plt.legend(loc='upper left')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "plt.plot(range(1, len(ada.cost_) + 1), ada.cost_, marker='o')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Average Cost')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<__main__.AdalineSGD at 0x112023cf8>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ada.partial_fit(X_std[0, :], y[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
